package org.web.base.domain.helper;

import java.lang.ref.WeakReference;
import java.lang.reflect.Field;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;

public class ClassHelper {

    /**
     * 缓存字段映射的ConcurrentHashMap，使用弱引用防止内存泄漏
     */
    private static final ConcurrentHashMap<Class<?>, WeakReference<Map<String, Field>>> FIELD_CACHE = new ConcurrentHashMap<>();
    /**
     * 获取指定类的字段映射缓存，如果缓存不存在或被回收，则重新构建。
     *
     * @param clazz 目标类
     * @return Map，key为字段名，value为Field对象
     */
    public static Map<String, Field> getCachedFields(Class<?> clazz) {
        WeakReference<Map<String, Field>> ref = FIELD_CACHE.get(clazz);
        Map<String, Field> fieldMap = ref != null ? ref.get() : null;

        if (fieldMap == null) {
            fieldMap = new HashMap<>();
            for (Field field : getAllFields(clazz)) {
                field.setAccessible(true);
                fieldMap.put(field.getName(), field);
            }
            FIELD_CACHE.put(clazz, new WeakReference<>(fieldMap));
        }

        return fieldMap;
    }

    /**
     * 递归获取指定类及其所有父类的声明字段（不包括Object类）
     *
     * @param clazz 目标类
     * @return 包含所有字段的List
     */
    private static List<Field> getAllFields(Class<?> clazz) {
        List<Field> fields = new ArrayList<>();
        for (Field field : clazz.getDeclaredFields()) {
            if (!java.lang.reflect.Modifier.isStatic(field.getModifiers())) {
                fields.add(field);
            }
        }
        if (clazz.getSuperclass() != null) {
            fields.addAll(getAllFields(clazz.getSuperclass()));
        }
        return fields;
    }
}
